home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C64Toolkit / FSERIAL.SDA / FAST SERIAL.SRC < prev    next >
Text File  |  2019-04-13  |  22KB  |  707 lines

  1. ;*********************************************************
  2. ;
  3. ; ╞AST SERIAL ┬╒╙ ROUTINES FOR 1541/71
  4. ;
  5. ; ╫RITTEN ┬Y ╥OBERT ┴. ╙TOERRLE (A.K.A. ═┴╠┴╦┴╔)
  6. ;
  7. ; ┴UGUST 29, 1988
  8. ;
  9. ; ╨OWER ┴SSEMBLER FORMAT
  10. ;
  11. ;**********************************************************
  12. ;
  13. ;╘HIS PACKAGE IS INTENDED TO INSTRUCT PROGRAMMERS WITH A
  14. ;REASONABLE PROFICIENCY IN ASSEMBLY LANGUAGE IN THE
  15. ;IMPLEMENTATION OF FAST SERIAL COMMUNICATION ROUTINES FOR
  16. ;THE 1571/41. ╘HE AUTHOR DOES NOT CLAIM THAT THESE ARE THE
  17. ;FASTEST TECHNIQUES.
  18. ;
  19. ;╨LEASE NOTE THAT THE ROUTINES PROVIDED DO NOT CONSTITUTE
  20. ;A COMPLETE DISK OPERATING SYSTEM BUT PROVIDE ONLY A MEANS
  21. ;FOR ACCESSING SPECIFIC TRACKS AND SECTORS ON THE DISK.
  22. ;╘HE ROUTINES CAN BE EASILY ACTIVATED AND DEACTIVATED AT
  23. ;WILL AND DO NOT AFFECT OTHER DEVICES ON THE SERIAL BUS.
  24. ;
  25. ;┬EST SPEED RESULTS ARE OBTAINED WHEN THE TEXT SCREEN IS
  26. ;BLANKED DURING FAST DATA TRANSFERS, AND THESE ROUTINES ARE
  27. ;SET UP TO BLANK THE SCREEN WHENEVER A DRIVE'S FAST ROUTINE
  28. ;IS ACTIVE. ┘OU WILL FIND NOTES WHERE APPROPRIATE ON
  29. ;CONFIGURING THE ROUTINES TO WORK WITH THE SCREEN ON.
  30. ;
  31. ;----------------------------------------------------------
  32. ;╙TANDARD ╦ERNAL ROUTINE EQUATES
  33. ;----------------------------------------------------------
  34. ;
  35. SETLFS  = $FFBA
  36. SETNAM  = $FFBD
  37. OPEN    = $FFC0
  38. CLOSE   = $FFC3
  39. CHKIN   = $FFC6
  40. CHKOUT  = $FFC9
  41. CLRCHN  = $FFCC
  42. CHRIN   = $FFCF
  43. CHROUT  = $FFD2
  44. ;
  45. ;----------------------------------------------------------
  46. ;├ONSTANTS
  47. ;----------------------------------------------------------
  48. ;
  49. DRIVESTART = $0500      ;╫HERE ═╠ WILL RESIDE IN DRIVE
  50.                         ; ╔F THIS IS CHANGED, THE ╒X COMMAND
  51.                         ; IN ┴├╘╔╓┴╘┼╞ MUST ALSO BE CHANGED!
  52. CIA        = $DD00      ;├OMPUTER INTERFACE TO SERIAL BUS
  53. ;
  54. ;----------------------------------------------------------
  55. ;╙TORAGE USED BY THIS PROGRAM
  56. ;----------------------------------------------------------
  57. ;
  58. STORAGE  = $C800        ;╙TART OF EXTERNAL STORAGE
  59. FASTBUF  = STORAGE      ;╚OLDS BLOCK RECEIVED/TO BE SENT
  60. VAR      = STORAGE+256  ;╙TART OF EXTERNAL VARIABLES
  61. FTRACK   = VAR          ;├URRENT TRACK
  62. FSECTOR  = VAR+1        ;├URRENT SECTOR
  63. BLOCKCNT = VAR+2        ;╬UMBER OF 32 BYTE CHUNKS TO SEND
  64. ;
  65. ;----------------------------------------------------------
  66. ;┌ERO-PAGE STORAGE USED BY THIS PROGRAM
  67. ;----------------------------------------------------------
  68. ;
  69. APTR    = $FB           ;╨OINTS INTO DRIVE CODE IN 64
  70. BPTR    = $FD           ;╨OINTS INTO DRIVE ╥┴═
  71. BVALUE  = $FB           ;┬YTE RECEIVED FROM DRIVE. ═╒╙╘ BE
  72.                         ;┌╨ FOR TIMING PURPOSES!
  73. ;
  74. ;----------------------------------------------------------
  75. ;╨ROGRAM START ADDRESS AND JUMP TABLE TO MAJOR ROUTINES
  76. ;----------------------------------------------------------
  77. ;
  78.    .ORG $C000           ;╨ROGRAM START ADDRESS. ═AY BE
  79.                         ; RELOCATED AT WILL
  80. ;
  81.    JMP PREPAREF         ;╙END ═╠ ROUTINES TO DRIVE
  82.    JMP ACTIVATEF        ;┴CTIVATE FAST ROUTINES IN DRIVE
  83.    JMP RELEASEF         ;─EACTIVATE FAST ROUTINES
  84.    JMP READF            ;╥EAD A BLOCK FROM DRIVE
  85.    JMP WRITEF           ;╫RITE A BLOCK TO DRIVE
  86.    JMP GETF             ;╟ET A BYTE FROM DRIVE
  87.    JMP SENDF            ;╙END A BYTE TO DRIVE
  88. ;
  89. ;----------------------------------------------------------
  90. ;├OMPUTER-RESIDENT ROUTINES
  91. ;----------------------------------------------------------
  92. ;
  93. ;╨╥┼╨┴╥┼╞ SENDS ═╠ ROUTINES TO THE DRIVE TO ACCOMPLISH THE
  94. ;FAST SERIAL BUS TRANSFERS, BUT DOES NOT ACTIVATE THE
  95. ;ROUTINES. ╘HAT ALLOWS SEVERAL DRIVES TO BE ACCESSED USING
  96. ;THE FAST ROUTINES BY INITIALIZING THEM EACH USING THIS
  97. ;ROUTINE.
  98. ;
  99. ;┬┼╞╧╥┼ ├┴╠╠╔╬╟: .┴ SHOULD CONTAIN DEVICE NUMBER (8-11)
  100. ;                   OF DRIVE BEING INITIALIZED.
  101. ;
  102. ;╘HE STANDARD ═-╫ COMMAND IS USED TO SEND THE CODE TO
  103. ;THE DRIVE IN 32 BYTE CHUNKS. ╘HE CORRECT AMOUNT OF CODE
  104. ;WILL BE SENT REGARDLESS OF WHETHER THE LENGTH OF THE
  105. ;DRIVE CODE IS CHANGED, SO FEEL FREE TO MAKE ADDITIONS/
  106. ;DELETIONS TO THE DRIVE PORTION OF THIS SOURCE. ╨LEASE
  107. ;NOTE THAT THIS ROUTINE DOES NOT PRESERVE ANY REGISTERS.
  108. ;
  109. PREPAREF = *
  110. ;
  111.    TAX
  112.    LDA #7
  113.    LDY #15
  114.    JSR SETLFS
  115.    LDA #0
  116.    JSR SETNAM
  117.    JSR OPEN             ;╧PEN AN ERROR CHANNEL TO DEVICE
  118. ;
  119.    LDA #<DRIVECODE      ;╙ET UP ┴╨╘╥ TO POINT TO DRIVE
  120.    STA APTR             ; CODE IN COMPUTER (APPENDED TO
  121.    LDA #>DRIVECODE      ; THE END OF THIS FILE)
  122.    STA APTR+1
  123.    LDA #<DRIVESTART     ;┬╨╘╥ WILL POINT TO CORRESPONDING
  124.    STA BPTR             ; ADDRESS IN DRIVE ╥┴═
  125.    LDA #>DRIVESTART
  126.    STA BPTR+1
  127.    LDA #ENDDRIVECODE-DRIVECODE/32+1
  128.    STA BLOCKCNT         ;╬UMBER OF 32 BYTE CHUNKS TO SEND
  129. ;
  130. PRP1 LDX #7             ;╙END AN ═-╫ COMMAND TO DRIVE
  131.    JSR CHKOUT
  132.    LDA #"M"
  133.    JSR CHROUT
  134.    LDA #"-"
  135.    JSR CHROUT
  136.    LDA #"W"
  137.    JSR CHROUT
  138.    LDA BPTR             ;╙END ADDRESS IN DRIVE ╥┴═
  139.    JSR CHROUT
  140.    LDA BPTR+1
  141.    JSR CHROUT
  142.    LDA #32              ;╬UMBER OF BYTES TO BE SENT
  143.    JSR CHROUT
  144.    LDY #0
  145. -  LDA (APTR),Y
  146.    JSR CHROUT           ;╙END 32 BYTES TO DRIVE
  147.    INY
  148.    CPY #32
  149.    BNE -
  150.    LDA APTR             ;╙ET UP POINTERS FOR NEXT
  151.    CLC                  ; 32 BYTE CHUNK
  152.    ADC #32
  153.    STA APTR
  154.    BCC +
  155.    INC APTR+1
  156. +  LDA BPTR
  157.    CLC
  158.    ADC #32
  159.    STA BPTR
  160.    BCC +
  161.    INC BPTR+1
  162. +  JSR CLRCHN
  163. ;
  164.    DEC BLOCKCNT         ;═ORE CHUNKS TO SEND?
  165.    BNE PRP1             ; ┘ES - GO BACK AND SEND ANOTHER
  166. ;
  167.    JSR CLRCHN           ; ╬O - ├LOSE FILE AND EXIT
  168.    LDA #7
  169.    JSR CLOSE
  170.    RTS
  171. ;
  172. ;┴├╘╔╓┴╘┼╞ IS USED TO ACTIVATE THE FAST SERIAL ROUTINES IN
  173. ;A DRIVE. ╨╥┼╨┴╥┼╞ MUST ALREADY HAVE BEEN CALLED FOR THE
  174. ;DRIVE, OR THE DRIVE WILL LIKELY CRASH! ╘HE SERIAL BUS WILL
  175. ;BE SEIZED BY THE DRIVE, SO WHILE FAST ROUTINES ARE ACTIVE
  176. ;IN ANY DRIVE, ╬╧ OTHER DRIVE OR SERIAL PERIPHERAL MAY BE
  177. ;USED. ═ULTI-DRIVE OPERATIONS ARE EASILY ACCOMPLISHED BY
  178. ;REPEATEDLY USING ┴├╘╔╓┴╘┼╞ AND ╥┼╠┼┴╙┼╞ FOR EACH DRIVE
  179. ;EACH TIME IT IS ACCESSED. ╬OTE THAT WHEN THE FAST SERIAL
  180. ;ROUTINES ARE NOT ACTIVE IN A DRIVE, NORMAL ─╧╙ COMMANDS
  181. ;MAY BE SENT TO THAT DRIVE. ╚OWEVER, KEEP IN MIND THAT
  182. ;THE DRIVE CODE (KEPT IN BUFFER 2 @ $500) MIGHT BE
  183. ;OVERWRITTEN, AND THUS ╨╥┼╨┴╥┼╞ SHOULD BE CALLED AGAIN
  184. ;FOR THAT DRIVE BEFORE ANY FURTHER FAST COMMUNICATION.
  185. ;
  186. ;┬┼╞╧╥┼ ├┴╠╠╔╬╟ ╘╚╔╙ ╥╧╒╘╔╬┼: .┴ = ─EVICE NUMBER (8-11)
  187. ;╧╬ ╥┼╘╒╥╬: ╬O REGISTERS ARE PRESERVED!
  188. ;
  189. ACTIVATEF = *
  190. ;
  191.    TAX
  192.    LDA #7
  193.    LDY #15
  194.    JSR SETLFS
  195.    LDA #0
  196.    JSR SETNAM
  197.    JSR OPEN             ;╧PEN AN ERROR CHANNEL TO DRIVE
  198. ;
  199.    LDA $D011            ;╘HESE THREE LINES BLANK THE SCREEN
  200.    AND #239             ; AND MAY BE REMOVED IF YOU DO NOT
  201.    STA $D011            ; WANT SCREEN BLANKING
  202. ;
  203.    LDX #7               ;╙END A ╒├ COMMAND TO THE DRIVE,
  204.    JSR CHKOUT           ; WHICH TELLS THE DRIVE TO BEGIN
  205.    LDA #"U"             ; EXECUTING CODE AT $500, WHICH
  206.    JSR CHROUT           ; IS WHERE THE FAST ROUTINE RESIDES
  207.    LDA #"C"
  208.    JSR CHROUT
  209.    LDA #13
  210.    JSR CHROUT
  211.    JSR CLRCHN
  212.    LDA #%00000111       ;├OMPUTER ALLOWS ├╠╦ AND ─┴╘┴ TO
  213.    STA CIA              ; GO HIGH
  214.    LDY #255             ;─ELAY LOOP NECESSARY TO ALLOW
  215.    LDX #127             ; DRIVE CODE TO INITIALIZE ITSELF
  216. -  DEX                  ; AND ENTER MAIN LOOP
  217.    BNE -
  218.    DEY
  219.    BNE -
  220.    RTS
  221. ;
  222. ;╘HIS ROUTINE TELLS THE DRIVE THAT IS CURRENTLY EXECUTING
  223. ;THE FAST ROUTINES TO RELEASE THE SERIAL BUS. ╘HE FAST 
  224. ;ROUTINES ARE DEACTIVATED, AND THE NORMAL ─╧╙ TAKES OVER
  225. ;IN THAT DRIVE.
  226. ;
  227. ;╔T IS NOT NECESSARY TO PASS THE DRIVE NUMBER TO THIS
  228. ;ROUTINE, AS ONLY ONE SERIAL DEVICE CAN BE ACTIVE AT
  229. ;ONCE. ╬OTE: ╬O REGISTERS ARE PRESERVED.
  230. ;
  231. RELEASEF = *
  232. ;
  233.    SEI
  234.    LDA #0               ;╙END COMMAND 0 (DEACTIVATE) TO
  235.    JSR SENDF            ; CURRENT DEVICE
  236.    CLI
  237. ;
  238.    LDA $D011            ;╘HESE THREE LINES REACTIVATE
  239.    ORA #16              ; THE TEXT SCREEN AND ARE
  240.    STA $D011            ; UNNECESSARY IF NOT BLANKED
  241. ;
  242.    LDA #7               ;├LOSE LOGICAL FILE TO KEEP THINGS
  243.    JMP CLOSE            ; TIDY FOR NORMAL ╧╙
  244. ;
  245. ;╥┼┴─╞ READS A BLOCK FROM THE CURRENTLY ACTIVE DRIVE.
  246. ;┬EFORE CALLING THIS ROUTINE, THE TRACK (1-35) SHOULD BE
  247. ;STORED IN ╞╘╥┴├╦, AND THE SECTOR SHOULD BE STORED IN
  248. ;╞╙┼├╘╧╥. ╧N RETURN, THE DATA IN THAT BLOCK WILL BE
  249. ;IN ╞┴╙╘┬╒╞. ┴LSO, THE ACCUMULATOR WILL BE SET TO REFLECT
  250. ;THE ERROR STATUS OF THE DRIVE. ╨OSSIBLE VALUES:
  251. ;
  252. ; 0 = ╧╦                           8 = ╫RITE PROTECT ON
  253. ; 1 = ╧╦                           9 = ╫RONG HEADER CHKSUM
  254. ; 2 = ┬LOCK HEADER NOT FOUND       ┴ = ─ATA BLOCK TOO LONG
  255. ; 3 = ╙YNC MARK NOT FOUND          ┬ = ┬AD DISK ╔─
  256. ; 4 = ─ATA BLOCK NOT FOUND         ─ = ╔NDEX HOLE NOT FOUND
  257. ; 5 = ┬AD DATA BLOCK CHECKSUM      ┼ = ├ONTROLLER ERROR
  258. ; 6 = ╞ORMAT ERROR                 ╞ = ╬O DISK FOUND
  259. ; 7 = ╓ERIFY ERROR
  260. ;
  261. ;╙TATUS BITS WILL BE SET TO REFLECT THE VALUE IN .┴
  262. ;╬O REGISTERS ARE PRESERVED.
  263. ;
  264. READF = *
  265. ;
  266.    SEI
  267.    LDA #1               ;╙END CODE 1 (READ BLOCK) TO DRIVE
  268.    JSR SENDF
  269.    LDA FTRACK           ;╙END TRACK/SECTOR TO DRIVE
  270.    JSR SENDF
  271.    LDA FSECTOR
  272.    JSR SENDF
  273.    LDY #0               ;╥ECEIVE 256 BYTES THAT MAKE UP
  274. -  JSR GETF             ; BLOCK FROM DRIVE
  275.    STA FASTBUF,Y
  276.    INY
  277.    BNE -
  278.    JSR GETF             ;257TH BYTE IS A STATUS BYTE
  279.    CLI
  280.    ORA #0               ;╙ET STATUS FLAGS TO REFLECT .┴
  281.    RTS
  282. ;
  283. ;╫╥╔╘┼╞ SENDS THE 256 BYTES AT ╞┴╙╘┬╒╞ TO THE BLOCK WHOSE
  284. ;TRACK IS IN ╞╘╥┴├╦ AND WHOSE SECTOR IS IN ╞╙┼├╘╧╥. ╧N
  285. ;RETURN, .┴ WILL CONTAIN THE ERROR STATUS, AS DISCUSSED FOR
  286. ;THE ╥┼┴─╞ ROUTINE ABOVE. ╬O REGISTERS ARE PRESERVED.
  287. ;
  288. WRITEF = *
  289. ;
  290.    SEI
  291.    LDA #2               ;╙END COMMAND 2 (WRITE BLOCK)
  292.    JSR SENDF
  293.    LDA FTRACK           ;╙END TRACK/SECTOR TO DRIVE
  294.    JSR SENDF
  295.    LDA FSECTOR
  296.    JSR SENDF
  297.    LDY #0               ;╙END 256 BYTES TO DRIVE
  298. -  LDA FASTBUF,Y
  299.    JSR SENDF
  300.    INY
  301.    BNE -
  302.    JSR GETF             ;╟ET ERROR STATUS FROM DRIVE
  303.    CLI
  304.    ORA #0               ;╙ET STATUS FLAGS TO REFLECT .┴
  305.    RTS
  306. ;
  307. ;╙┼╬─╞ SENDS A SINGLE BYTE (IN .┴) TO THE CURRENT FAST
  308. ;DRIVE. ╘HE CONVENTIAL SERIAL BUS COMMUNICATION ROUTINES
  309. ;ARE SLOW BECAUSE THEY SEND ONE BIT AT A TIME AND INCLUDE
  310. ;A LOT OF "HANDSHAKING" BETWEEN EACH BIT. ╘HESE ROUTINES
  311. ;ONLY HANDSHAKE AT THE BEGINNING OF EACH ┬┘╘┼. ╔N ADDITION
  312. ;╘╫╧ BYTES ARE SENT AT ONCE (VIA THE USE OF THE ├╠╦ LINE
  313. ;IN ADDITION TO ─┴╘┴ TO SEND BITS). ╙INCE THERE IS NO
  314. ;HANDSHAKING WHILE SENDING A BYTE, THE TIMING OF THE
  315. ;SENDING ROUTINE (IN THE COMPUTER) MUST MATCH THE TIMING
  316. ;OF THE RECEIVING ROUTINE (IN THE DRIVE) IN ORDER FOR
  317. ;A BYTE TO BE TRANSMITTED PROPERLY.
  318. ;
  319. SENDF = *
  320. ;
  321. -  LDX $D012            ;╫AIT FOR ELECTRON GUN TO MOVE
  322.    CPX #48              ; OFF OF VISIBLE SCREEN. ╘HESE 3
  323.    BCS -                ; LINES CAN BE REMOVED IF BLANKED
  324. ;
  325.    LDX #%00010111       ;┬RING ├╠╦ LINE LOW TO SIGNAL
  326.    NOP                  ; DRIVE THAT A BYTE IS ON ITS
  327.    NOP                  ; WAY. ╟IVE DRIVE SOME TIME (╬╧╨S)
  328.    NOP                  ; TO ENTER RECEIVE BYTE ROUTINE
  329.    NOP
  330.    NOP                  ;╙ERIAL PORT LINES ARE FOUND AT
  331.    STX CIA              ; ├╔┴ LOCATION $──00 IN ├64
  332.    PHA
  333.    AND #3               ;╔SOLATE BITS 0 AND 1 AND USE
  334.    TAX                  ; TABLE TO DETERMINE PROPER VALUE
  335.    LDA FTABLE,X         ; TO GIVE ├╠╦ AND ─┴╘┴ EACH A BIT
  336.    STA CIA
  337.    LDA $FF              ;3-CYCLE DELAY
  338.    NOP                  ;╬╧╨ = 2 CYCLE DELAY
  339.    PLA                  ;╥ETRIEVE ORIGINAL BYTE
  340.    LSR                  ;╟ET BITS 2 AND 3
  341.    LSR
  342.    PHA
  343.    AND #3               ;╔SOLATE BITS AND SEND AS ├╠╦
  344.    TAX                  ; AND ─┴╘┴
  345.    LDA FTABLE,X
  346.    STA CIA
  347.    NOP
  348.    PLA                  ;╥EPEAT PROCEDURE FOR BITS 4 AND 5
  349.    LSR
  350.    LSR
  351.    PHA
  352.    AND #3
  353.    TAX
  354.    LDA FTABLE,X
  355.    STA CIA
  356.    NOP
  357.    PLA                  ;╥EPEAT PROCEDURE FOR BITS 6 AND 7
  358.    LSR
  359.    LSR
  360.    AND #3
  361.    TAX
  362.    LDA FTABLE,X
  363.    STA CIA
  364.    NOP                  ;╠ONG DELAY WHILE DRIVE PROCESSES
  365.    NOP                  ; LAST TWO BITS
  366.    NOP
  367.    NOP
  368.    NOP
  369.    NOP
  370.    NOP
  371.    NOP
  372.    NOP
  373.    NOP
  374.    NOP
  375.    LDA #%00000111       ;┬RING ├╠╦ AND ─┴╘┴ HIGH TO
  376.    STA CIA              ; PREPARE FOR NEXT SEND/GET
  377.    RTS
  378. ;
  379. ;╥ECEIVE A BYTE FROM THE CURRENT FAST DRIVE. ╘HE BYTE
  380. ;WILL BE RETURNED IN THE ACCUMULATOR. ╬O REGISTERS ARE
  381. ;PRESERVED. ╙EE NOTES FOR ╙┼╬─╞ ABOVE.
  382. ;
  383. GETF = *
  384. ;
  385.    LDA #64              ;╫AIT FOR ├╠╦ TO GO LOW, WHICH
  386. -  BIT CIA              ; MEANS DRIVE IS READY TO SEND
  387.    BNE -
  388. ;
  389. -  LDA $D012            ;╫AIT FOR ELECTRON GUN TO MORE OFF
  390.    CMP #48              ;SCREEN. ╬OT NECESSARY IF BLANKING
  391.    BCS -                ;IS BEING USED!
  392. ;
  393. +  LDA #%00100011       ;┬RING ─┴╘┴ LOW AS A SIGNAL THAT
  394.    STA CIA              ; COMPUTER IS READY TO RECEIVE
  395.    NOP                  ;╠ONG DELAY WHILE DRIVE PREPARES
  396.    NOP                  ; FIRST TWO BITS
  397.    NOP
  398.    NOP
  399.    NOP
  400.    NOP
  401.    NOP
  402.    NOP
  403.    NOP
  404.    NOP
  405.    NOP
  406.    NOP
  407.    NOP
  408.    NOP
  409.    LDA #%00000011       ;┴LLOW ├╠╦ AND ─┴╘┴ TO GO HIGH SO
  410.    STA CIA              ; DRIVE HAS CONTROL OF THEM
  411.    LDX #4               ;╠OOP TO GET 4 PAIRS OF BITS
  412. -  LDA CIA              ;╥EAD SERIAL BUS
  413.    ROL                  ;╥OLL TWO BITS OUT OF SERIAL BUS
  414.    ROR BVALUE           ; INTERFACE REGISTER INTO STORAGE
  415.    ROL                  ; FOR CURRENT BYTE
  416.    ROR BVALUE
  417.    NOP
  418.    LDA $FF              ;3 CYCLE DELAY
  419.    DEX
  420.    BNE -
  421.    LDA BVALUE           ;╥ETURN WITH COMPLETE BYTE
  422.    RTS
  423. ;
  424. ;╘ABLE FOR FAST SEND ROUTINE (COMPUTER). ╘HIS TABLE IS USED
  425. ;TO CONVERT A BIT PAIR INTO THE NECESSARY VALUE TO STORE
  426. ;AT THE SERIAL BUS COMMUNICATION REGISTER. ├╠╦ TAKES ON THE
  427. ;VALUE OF THE LEAST SIGNIFICANT BIT AND ─┴╘┴ REPRESENTS THE
  428. ;═╙┬.
  429. ;
  430. FTABLE .BYTE %00000111  ;┬IT PAIR 00
  431.        .BYTE %00010111  ;01
  432.        .BYTE %00100111  ;02
  433.        .BYTE %00110111  ;03
  434. ;
  435. ;----------------------------------------------------------
  436. ;╘HIS CODE WILL RESIDE IN DRIVE MEMORY
  437. ;----------------------------------------------------------
  438. ;
  439. DRIVECODE = *
  440. ;
  441. ;╔N ORDER TO INSURE MAXIMUM COMPATIBILITY WITH VARIOUS
  442. ;1541 "CLONES," ONLY THE STANDARD MEANS OF INTERFACING WITH
  443. ;THE DRIVE CONTROLLER WAS USED, E.G. THE JOB LOOP. ╘HIS IS
  444. ;AN INTERRUPT-DRIVEN ROUTINE THAT PERFORMS THE MOST BASIC
  445. ;DRIVE FUNCTIONS (I.E. READING AND WRITING A BLOCK).
  446. ;
  447.    .OFF $0500           ;┬EGIN OFFSET CODING.
  448. ;
  449. ;╓╔┴ (╓ERSATILE ╔NTERFACE ┴DAPTOR) EQUATES
  450. ;
  451. VIA1      = $1800       ;╔NTERFACE TO SERIAL BUS
  452. VIA2      = $1C00       ;CONTROLS DRIVE ELECTRONICS
  453. ;
  454. ;╩OB LOOP INTERFACE LOCATIONS.
  455. ;
  456. JOB       = 0           ;╩OB TO BE EXECUTED/JOB STATUS
  457. JOBTRACK  = 6           ;╘RACK FOR CURRENT JOB
  458. JOBSECTOR = 7           ;╙ECTOR FOR CURRENT JOB
  459. JOBBUFFER = $300        ;┬UFFER USED BY JOB LOOP 0
  460. ;
  461. ;┌ERO-PAGE LOCATIONS IN DRIVE MEMORY USED FOR TEMPORARY
  462. ;STORAGE BY THESE ROUTINES.
  463. ;
  464. BYTE      = 44          ;┬YTE TO SEND/BYTE RECEIVED
  465. FYTEMP    = 45          ;╙TORAGE FOR ┘ REGISTER
  466. ;
  467. ;╘HIS ROUTINE INITIALIZES THE DRIVE FOR FAST COMMUNICATION.
  468. ;
  469.    SEI                  ;╠OCK OUT NORMAL INTERRUPTS
  470.    LDA VIA2             ;╘URN OFF THE DRIVE LIGHT
  471.    AND #$F7             ; (COSMETIC PURPOSES ONLY)
  472.    STA VIA2 
  473.    LDY #127             ;╫AIT FOR COMPUTER TO GET READY
  474.    LDX #63
  475. -  DEX
  476.    BNE -
  477.    DEY
  478.    BNE -
  479. ;
  480. ;═AIN LOOP - ACCEPT THE FOLLOWING ONE-BYTE COMMAND CODES
  481. ;FROM THE COMPUTER:
  482. ;
  483. ;   0 = ╥ETURN TO NORMAL ─╧╙          2 = ╫RITE A BLOCK
  484. ;   1 = ╥EAD A BLOCK
  485. ;
  486. ;├OMMANDS 1 AND 2 REQUIRE TWO MORE BYTES TO FOLLOW
  487. ;IMMEDIATELY: THE TRACK AND SECTOR FOR THE GIVEN OPERATION.
  488. ;
  489. LOOP = *
  490. ;
  491.    JSR GET              ;╫AIT FOR AND RETRIEVE COMMAND
  492.    CMP #1               ; NUMBER FROM COMPUTER. ╔F NOT
  493.    BNE LOOP2            ; COMMAND 1 (READ), BRANCH...
  494. ;
  495. ;├OMMAND #1: ╥EAD A BLOCK FROM SPECIFIED TRACK/SECTOR.
  496. ;╔F THERE ARE ERRORS, THE OPERATION WILL BE RETRIED SEVEN
  497. ;TIMES BEFORE AN ERROR CONDITION IS REPORTED TO THE
  498. ;COMPUTER.
  499. ;
  500.    JSR GET              ;╟ET TRACK
  501.    STA JOBTRACK
  502.    JSR GET              ;╟ET SECTOR
  503.    STA JOBSECTOR
  504.    LDA VIA2             ;╘URN DRIVE LIGHT ON DURING READ
  505.    ORA #8               ; OPERATION
  506.    STA VIA2             ; (COSMETIC PURPOSES ONLY)
  507.    LDA #7               ;7 ATTEMPTS BEFORE GIVING UP
  508.    STA BYTE
  509. FRL LDA #$80            ;$80 = ╩OB TO READ A BLOCK
  510.    STA JOB
  511.    CLI                  ;┴LLOW INTERRUPT-DRIVEN JOB
  512. -  BIT JOB              ; LOOP TO FUNCTION. ╫HEN VALUE
  513.    BMI -                ; BECOMES POSITIVE, JOB IS
  514.    SEI                  ; FINISHED
  515.    LDA JOB              ;╩╧┬ NOW CONTAINS ERROR STATUS
  516.    CMP #2               ;╔F ╧╦, SEND BYTES TO COMPUTER
  517.    BCC +
  518.    DEC BYTE             ;╧THERWISE, TRY AGAIN
  519.    BNE FRL
  520. +  LDA VIA2             ;╘URN DRIVE LIGHT OFF
  521.    AND #$F7             ; (COSMETIC PURPOSES ONLY)
  522.    STA VIA2 
  523.    LDY #0               ;╙END 256 BYTES THAT MAKE UP
  524. -  LDA JOBBUFFER,Y      ; BLOCK TO COMPUTER
  525.    JSR SEND
  526.    INY
  527.    BNE -
  528.    LDA JOB              ;╙END ERROR STATUS TO COMPUTER
  529.    JSR SEND
  530.    JMP LOOP             ;╥ETURN TO WAIT FOR NEXT COMMAND
  531. ;
  532. ;├ONTINUATION OF MAIN LOOP: IF NOT COMMAND #2 (WRITE BLOCK)
  533. ;THEN BRANCH...
  534. ;
  535. LOOP2 CMP #2
  536.    BNE LOOP3
  537. ;
  538. ;├OMMAND #2: ╥ECEIVE A TRACK AND SECTOR, AS WELL AS 256
  539. ;BYTES FROM COMPUTER AND WRITE THEM TO DISK AT THE
  540. ;SPECIFIED TRACK AND SECTOR.
  541. ;
  542. DDWRITE JSR GET         ;╟ET TRACK
  543.    STA JOBTRACK
  544.    JSR GET              ;╟ET SECTOR
  545.    STA JOBSECTOR
  546.    LDY #0               ;╥ECEIVE 256 BYTES FROM COMPUTER
  547. -  JSR GET              ; AND STORE IN JOB BUFFER
  548.    STA JOBBUFFER,Y
  549.    INY
  550.    BNE -
  551.    LDA #7               ;7 ATTEMPTS BEFORE REPORTING ERROR
  552.    STA BYTE
  553. FWL LDA #$90            ;$90 = ╩OB TO WRITE A SECTOR
  554.    STA JOB
  555.    LDA VIA2             ;╘URN ON DRIVE LIGHT
  556.    ORA #8               ; (COSMETIC PURPOSES ONLY)
  557.    STA VIA2 
  558.    CLI                  ;┴LLOW INTERRUPT-DRIVEN JOB LOOP
  559. -  BIT JOB              ; TO FUNCTION. ╓ALUE WILL BECOME
  560.    BMI -                ; POSITIVE WHEN JOB IS FINISHED
  561.    SEI
  562.    LDA VIA2             ;╘URN OFF DRIVE LIGHT
  563.    AND #$F7             ; (COSMETIC PURPOSES ONLY)
  564.    STA VIA2 
  565.    LDA JOB              ;─ID JOB LOOP REPORT AN ERROR?
  566.    CMP #2
  567.    BCC +                ; ╬O - REPORT ╧╦ STATUS TO COMPUTER
  568.    DEC BYTE             ; ┘ES - TRY AGAIN
  569.    BNE FWL
  570. +  JSR SEND             ;╙END ERROR STATUS TO COMPUTER
  571.    JMP LOOP             ;╥ETURN TO WAIT FOR NEXT COMMAND
  572. ;
  573. ;┴NY COMMAND OTHER THAN 1 OR 2 RESULTS IN TERMINATION OF
  574. ;THE FAST SERIAL ROUTINES AND RETURN TO NORMAL ─╧╙.
  575. ;
  576. LOOP3 CLI
  577.    RTS
  578. ;
  579. ;╥ECEIVE A BYTE FROM THE COMPUTER USING THE FAST SERIAL
  580. ;PROTOCOL.
  581. ;
  582. GET = *
  583. ;
  584.    LDA #0               ;┴LLOW ├╠╦ AND ─┴╘┴ TO GO HIGH
  585.    STA VIA1             ; TO GIVE COMPUTER CONTROL OF THEM
  586.    LDA #4
  587. -  BIT VIA1             ;╫AIT FOR ├╠╦ TO GO LOW
  588.    BEQ -
  589.    NOP                  ;╠ONG DELAY WHILE COMPUTER PREPARES
  590.    NOP                  ; FIRST 2 BITS TO SEND
  591.    NOP
  592.    NOP
  593.    NOP
  594.    NOP
  595.    NOP
  596.    NOP
  597.    NOP
  598.    NOP
  599.    NOP
  600.    NOP
  601.    LDA VIA1             ;╥EAD SERIAL BUS AND ISOLATE ├╠╦
  602.    AND #7               ; AND ─┴╘┴ INPUT LINES (BITS 2
  603.    TAX                  ; AND 1. ┬IT 1 IS ─┴╘┴ OUT)
  604.    LDA FTABLE1,X        ;╠OOK UP PROPER BIT PAIR IN TABLE
  605.    STA BYTE
  606.    NOP                  ;╫AIT FOR NEXT 2 BITS TO BE PUT ON
  607.    NOP                  ; SERIAL BUS
  608.    NOP
  609.    NOP
  610.    NOP
  611.    LDA VIA1             ;╔SOLATE ├╠╦ AND ─┴╘┴ LINES AND
  612.    AND #7               ; USE TABLE TO LOOK UP BIT PAIR.
  613.    TAX
  614.    LDA FTABLE2,X
  615.    ORA BYTE             ;├OMBINE BITS 2 AND 3 (JUST READ)
  616.    STA BYTE             ; WITH BITS 0 AND 1 (ALREADY READ)
  617.    NOP
  618.    LDA $FF              ;3-CYCLE DELAY
  619.    NOP
  620.    LDA VIA1             ;╥EPEAT PROCESS FOR BITS 4 AND 5
  621.    AND #7
  622.    TAX
  623.    LDA FTABLE3,X
  624.    ORA BYTE
  625.    STA BYTE
  626.    NOP
  627.    LDA $FF              ;3-CYCLE DELAY
  628.    NOP
  629.    LDA VIA1             ;╥EPEAT PROCESS FOR BITS 6 AND 7
  630.    AND #7
  631.    TAX
  632.    LDA FTABLE4,X
  633.    ORA BYTE             ;╫E NOW HAVE COMPLETE BYTE
  634.    RTS
  635. ;
  636. ;╙END A BYTE TO THE COMPUTER USING THE FASTER SERIAL
  637. ;PROTOCOL.
  638. ;
  639. SEND = *
  640. ;
  641.    STA BYTE             ;╙AVE BYTE
  642.    STY FYTEMP           ;╨RESERVE ┘ REGISTER
  643.    LDA #%00001000       ;┬RING ├╠╦ LOW TO TELL COMPUTER
  644.    STA VIA1             ; THAT DRIVE IS READY TO SEND
  645.    LDA #1               ;╫AIT FOR ─┴╘┴ TO GO LOW, WHICH
  646. -  BIT VIA1             ; MEANS THAT COMPUTER IS READY
  647.    BEQ -                ; TO RECEIVE
  648.    LDA BYTE             ;╥ECALL BYTE TO BE SENT
  649.    LDY #4               ;╠OOP TO SEND 4 PAIRS OF BITS
  650. -  STA BYTE             ;╙AVE CURRENT BYTE VALUE
  651.    AND #3               ;╔SOLATE BITS 0 AND 1 AND USE
  652.    TAX                  ; TABLE TO LOOK UP PROPER VALUE
  653.    LDA FTABLE5,X        ; TO STORE IN COMMUNICATIONS
  654.    STA VIA1             ; REGISTER TO REFLECT THOSE BITS
  655.    LDA BYTE             ;╥ECALL CURRENT BYTE
  656.    LSR                  ;╙HIFT BYTE RIGHT SO THAT BITS 2
  657.    LSR                  ; AND 3 BECOME BITS 0 AND 1, ETC
  658.    DEY
  659.    BNE -                ;╥ETURN FOR REMAINING BIT PAIRS
  660.    LDY FYTEMP           ;╟ET BACK ORIGINAL ┘ REGISTER VALUE
  661.    NOP                  ;╫AIT FOR COMPUTER TO PROCESS LAST
  662.    NOP                  ; BIT PAIR
  663.    NOP
  664.    NOP
  665.    NOP
  666.    NOP
  667.    LDA #0               ;┬RING ├╠╦ AND ─┴╘┴ HIGH TO GIVE
  668.    STA VIA1             ; CONTROL OF SERIAL BUS TO COMPUTER
  669.    RTS
  670. ;
  671. ;╘ABLES FOR USE BY DRIVE RECEIVE ROUTINE. ╙INCE THE ├╠╦
  672. ;AND ─┴╘┴ INPUT LINES ARE NOT TWO CONSECUTIVE BITS, IT
  673. ;IS NECESSARY TO ISOLATE AN EXTRA BIT, WHICH MEANS THAT
  674. ;THERE ARE 8 POSSIBLE VALUES, WHICH YIELD ONLY 4 DIFFERENT
  675. ;BIT PAIRS. ┴ SEPARATE TABLE IS USED FOR EACH BIT PAIR
  676. ;RECEIVED, IN ORDER TO EASILY CONSTRUCT A COMPLETE BYTE.
  677. ;╞╘┴┬╠┼1 HANDLES BITS 0 AND 1, ╞╘┴┬╠┼2 HANDLES BITS 2 AND3,
  678. ;AND SO ON.
  679. ;
  680. FTABLE1 .BYTE %00,%10,%00,%10
  681.         .BYTE %01,%11,%01,%11
  682. FTABLE2 .BYTE %0000,%1000,%0000,%1000
  683.         .BYTE %0100,%1100,%0100,%1100
  684. FTABLE3 .BYTE %000000,%100000,%000000,%100000
  685.         .BYTE %010000,%110000,%010000,%110000
  686. FTABLE4 .BYTE %00000000,%10000000,%00000000,%10000000
  687.         .BYTE %01000000,%11000000,%01000000,%11000000
  688. ;
  689. ;╘ABLE USED BY DRIVE SEND ROUTINE. ╘HIS TABLE TRANSLATES
  690. ;A PAIR OF BITS INTO THE PROPER VALUE TO STORE AT THE
  691. ;SERIAL COMMUNICATIONS REGISTER (AT $1800) TO MAKE THE ├╠╦
  692. ;AND ─┴╘┴ LINES REFLECT THOSE BITS.
  693. ;
  694. FTABLE5 .BYTE %00001010
  695.         .BYTE %00001000
  696.         .BYTE %00000010
  697.         .BYTE %00000000
  698. ;
  699. ;┼ND OF DRIVE CODE
  700. ;
  701.    .OFE                 ;┼NDS OFFSET CODING
  702. ;
  703. ENDDRIVECODE = *        ;═ARKS END OF DRIVE CODE IN
  704.                         ;RELATION TO REGULAR PROGRAM
  705. ;
  706.    .END
  707.